package com.example.shardingsphere.controller.result;

import com.example.shardingsphere.entity.User;
import lombok.Data;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;

/**
 * 表格分页数据对象
 */
@Data
public class TableDataInfo<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 总记录数
     */
    private long total;

    /**
     * 列表数据
     */
    private List<T> rows;

    /**
     * 消息状态码
     */
    private String code;

    /**
     * 消息内容
     */
    private String msg;

    /**
     * 当前页码
     */
    private int pageNum;

    /**
     * 每页条数
     */
    private int pageSize;

    /**
     * 默认成功状态码
     */
    private static final String DEFAULT_SUCCESS_CODE = "200";

    /**
     * 默认成功消息
     */
    private static final String DEFAULT_SUCCESS_MSG = "操作成功";

    /**
     * 默认失败状态码
     */
    private static final String DEFAULT_ERROR_CODE = "500";

    /**
     * 默认失败消息
     */
    private static final String DEFAULT_ERROR_MSG = "操作失败";


    /**
     * 成功返回（带分页信息）
     * @param list 数据列表
     * @param total 总记录数
     * @param pageNum 当前页码
     * @param pageSize 每页条数
     */
    public TableDataInfo(List<T> list, long total, int pageNum, int pageSize) {
        this.code = DEFAULT_SUCCESS_CODE;
        this.msg = DEFAULT_SUCCESS_MSG;
        this.rows = list != null ? list : Collections.emptyList();
        this.total = total;
        this.pageNum = pageNum;
        this.pageSize = pageSize;
    }

    /**
     * 成功返回（无分页信息）
     * @param list 数据列表
     */
    public TableDataInfo(List<T> list) {
        this.code = DEFAULT_SUCCESS_CODE;
        this.msg = DEFAULT_SUCCESS_MSG;
        this.rows = list != null ? list : Collections.emptyList();
        this.total = list != null ? list.size() : 0;
        this.pageNum = 1;
        this.pageSize = list != null ? list.size() : 0;
    }

    /**
     * 错误返回
     * @param code 错误码
     * @param msg 错误消息
     */
    public TableDataInfo(String code, String msg) {
        this.code = code;
        this.msg = msg;
        this.rows = Collections.emptyList();
        this.total = 0;
    }

    /**
     * 静态工厂方法：创建成功响应（带分页）
     */
    public static <T> TableDataInfo<T> success(List<T> list, long total, int pageNum, int pageSize) {
        return new TableDataInfo<>(list, total, pageNum, pageSize);
    }

    /**
     * 静态工厂方法：创建成功响应（无分页）
     */
    public static <T> TableDataInfo<T> success(List<T> list) {
        return new TableDataInfo<>(list);
    }

    /**
     * 静态工厂方法：创建空数据响应
     */
    public static <T> TableDataInfo<T> empty() {
        return new TableDataInfo<>(Collections.emptyList(), 0, 1, 0);
    }

    /**
     * 静态工厂方法：创建错误响应
     */
    public static <T> TableDataInfo<T> error(String code, String msg) {
        return new TableDataInfo<>(code, msg);
    }

    /**
     * 静态工厂方法：创建默认错误响应
     */
    public static <T> TableDataInfo<T> error() {
        return new TableDataInfo<>(DEFAULT_ERROR_CODE, DEFAULT_ERROR_MSG);
    }
}